package org.javahispano.javacup.tacticas_aceptadas.FGR.javacup2009.gallegux.javacup2009.canelaenrama;



import org.javahispano.javacup.modelo.Posicion;


public class Marcajes 
{
	

	
	int[] marcaje = new int[11];
	// el indice indica nuestro jugador, y el valor el jugador rival marcado
	Posicion[] posicionesAnt = null;
	Posicion[] posicionesAct = null;
	
	
	public Marcajes()
	{
		reset();
	}
	//////////////////////////////////////////////////////////////////////////
	// METODOS DE MARCAJES
	//////////////////////////////////////////////////////////////////////////
	
	/**
	 * se eliminan los marcajes
	 */
	public void reset()
	{
		for (int i = 0; i < 11; i++) {
			marcaje[i] = -1;
		}
	}
	
	
	/**
	 * devuelve si un jugador mio esta marcando a un rival
	 * @param jugadorMio
	 * @return
	 */
	public boolean estaMarcando(int jugadorMio)
	{
		return marcaje[jugadorMio] != -1;
	}
	
	
	/**
	 * devuelve el jugador marcado por un jugador mio
	 * @param jugadorMio
	 * @return
	 */
	public int jugadorMarcado(int jugadorMio)
	{
		return marcaje[jugadorMio];
	}

	
	/**
	 * devuelve el jugador mio que marca al rival
	 */
	public int marcador(int jugadorRival)
	{
		int miJug = -1;
		
		for (int i = 1; i < 11 && miJug == -1; i++) {
			if (marcaje[i] == jugadorRival) {
				miJug = i;
			}
		}
		
		return miJug;
	}
	
	/**
	 * devuelve si el jugador rival esta marcado por uno de los nuestros
	 * @param jugadorRival
	 * @return
	 */
	public boolean estaMarcado(int jugadorRival)
	{
		boolean marcado = false;
		
		for (int i = 1; i < 11 && !marcado; i++) {
			marcado = marcaje[i] == jugadorRival;
		}
		
		return marcado;
	}
	
	
	/**
	 * cuenta los jugadores que estan marcando a un rival
	 * @return
	 */
	public int countJugadoresMarcando()
	{
		int count = 0;
		
		for (int i = 1; i < 11; i++) {
			if (marcaje[i] != -1) {
				count++;
			}
		}
		
		return count;
	}


	/**
	 * obtiene un jugador que no marca a ningun rival
	 * @return
	 */
	public int obtenerDefensaLibre(Posicion posJugRival, Posicion[] misJugadores)
	{
		int j;
		
		for (j = 1; j < 11 && estaMarcando(j); j++);
		
		return j;
	}
	

//	/**
//	 * crea un marcaje a un rival
//	 * @param jugadorRival
//	 */
//	public void nuevoMarcajeRival(int jugadorRival, Posicion[] misJugadores)
//	{
//		marcaje[obtenerDefensaLibre(new Posicion(), misJugadores)] = jugadorRival;
//	}
	
	
	
	public void nuevoMarcajeRival(int numJugRival, Posicion posJugRival, 
			Posicion[] posJugsMios)
	{
		int jugMioMasCerca = -1;
		int bucleInicio = 0, bucleFin = 0;
		double distancia, distanciaMarCorta = 99999;
		
		if (jugadorMarcado(1) == -1 || jugadorMarcado(2) == -1 || jugadorMarcado(3) == -1) { 
			bucleInicio = 1;
			bucleFin = 3;
		}
		else if (jugadorMarcado(4) == -1 || jugadorMarcado(5) == -1) {
			bucleInicio = 4;
			bucleFin = 5;
		}
		else if (jugadorMarcado(6) == -1 || jugadorMarcado(7) == -1) {
			bucleInicio = 6;
			bucleFin = 7;
		}
		else if (jugadorMarcado(8) == -1 || jugadorMarcado(9) == -1 || jugadorMarcado(10) == -1) {
			bucleInicio = 8;
			bucleFin = 10;
		}
		
		for (int i = bucleInicio; i <= bucleFin; i++) {
			if (!estaMarcando(i)) {
				distancia = posJugRival.norma(posJugsMios[i]);
				if (distancia < distanciaMarCorta) {
					distanciaMarCorta = distancia;
					jugMioMasCerca = i;
				}
			}
		}
		
		if (jugMioMasCerca != -1) marcaje[jugMioMasCerca] = numJugRival;
	}
	

	/**
	 * elimina un marcaje a un rival
	 * @param jugadorRival
	 */
	public void eliminaMarcajeRival(int jugadorRival)
	{
		marcaje[marcador(jugadorRival)] = -1;
	}
	
	
	
	public String toString()
	{
		StringBuilder sb = new StringBuilder();
		
		for (int i = 1; i < 11; i++) {
			if (estaMarcando(i)) {
				sb.append(i);
				sb.append('-');
				sb.append(jugadorMarcado(i));
				sb.append(' ');
			}
		}
		
		return sb.toString();
	}
	
	//////////////////////////////////////////////////////////////////////////
	// FIN METODOS DE MARCAJES
	//////////////////////////////////////////////////////////////////////////


}
